// 本页面思路
/**
 * 思路
 * 1.获取用户的收货地址
 *     1 绑定点击事件
 *     2 调用小程序内置api 获取用户的收货地址 wx.chooseAddress
 * 2.获取用户对小程序所授予获取地址的权限状态
 *     1 假设用户点击获取收货地址的提示框 确定 getsetting.address scope 值为true
 *     2 假设用户点击获取收货地址的提示框 取消 getsetting.address scope 值为false
 *     3 假设用户点击获取收货地址的提示框 不点 getsetting.address scope 值为undfind
 *     4 让用户自己打开授权设置页面(wx.openSetting) 获取收货地址   
 *     5 把获取到的数据存入缓存
 *   
 * 2.页面加载完毕     
 *    1 获取本地存储中的地址数据
 *    2 把数据设置给data中的一个变量
 * 3.onshow 
 *     获取缓存中的数据 或数组填充到data中
 * 4.全选
 *     根据购物车中的商品数据 所有的商品都被选中 checked=true
 * 5.总价格和总数量
 *      1 需要商品被选中，才进行计算
 *      2 获取缓存中购物车数据
 *      3 遍历 
 *      4 判断商品是否被选中
 *      5 总价格 += 商品的数量 * 商品价格
 *      6 总数量 += 商品的数量 
 * 6.商品的选中
 *     1 绑定change事件
 *     2 获取到被修改的商品对象
 *     3 商品对象的选中状态 取反
 *     4 重新填充回data中和缓存中
 *     5 重新计算全选 总价格 总数量
 * 7.全选 反选
 *    1 全选复选框绑定change事件
 *    2 获取data中的全选变量 allchecked
 *    3 直接取反 allchecked =！allchecked
 *    4 遍历购物车数组 让里面商品 选中状态跟随 allchecked改变而改变
 *    5 把购物车数组 和allchecked 重新设置回data中 把购物车数据重 新存储到缓存中
 * 8.商品数量编辑
 *    1 "+" "-" 按钮绑定同一个点击事件 自定义属性区分
 *       1 "+" +1
 *       2 "-" -1
 *    2 传递被点击的商品id goods_id
 *    3 获取data中的购物车数组 来获取需要被修改的商品对象
 *    4 直接修改商品对象的数量num
 *    5 把cart数组 重新设置回data中 把购物车数据重 新存储到缓存中
 * 9.点击结算
 *    1 判断有没有收获地址
 *    2 判断用户有没有选购商品
 *    3 经过上面的验证后跳转到支付页面
 */

import {
  getSetting,
  chooseAddress,
  openSetting,
  showModal,
  showToast
} from "../../utils/asyncWx"
Page({
  data: {
    address: {}, // 收货地址信息
    cart: [], // 购物车数据
    allchecked: false, // 全选
    totalPrice: 0, // 总价格
    totalNum: 0 // 总数量
  },
  onShow() {
    // 1.获取缓存中的收货地址信息
    const address = wx.getStorageSync('address')
    // 从存储中获取购物车数据
    const cart = wx.getStorageSync('cart') || [];
    this.setData({
      address
    })
    this.setCart(cart);
  },
  //  获取收货地址
  async handleChooseAddress() {
    // 1.获取权限状态
    // wx.getSetting({

    //   success: (result) => {
    //      const scopeAddress = result.authSetting["scope.address"];
    //     //  等于true 或者 undefined 允许获取
    //      if(scopeAddress === true || scopeAddress === undefined){
    //         wx.chooseAddress({
    //           success: (result1) => {
    //              console.log(result1);
    //           },
    //         })
    //      }else{
    //       //  用户以前拒绝授予权限 引诱用户打开授权页面
    //       wx.openSetting({
    //         success: (result2) => {
    //           // 可以调用获取收货地址
    //           wx.chooseAddress({
    //             success: (result3) => {
    //                console.log(result3);
    //             },
    //           })
    //         },

    //       })
    //      }
    //   },
    //   fail: (res) => {},
    //   complete: (res) => {},
    // })

    try {
      // 1.获取权限状态
      const res1 = await getSetting()
      const scopeAddress = res1.authSetting["scope.address"];
      // 2.判断 权限状态
      if (scopeAddress === false) {
        //  3.诱导用户打开授权页面
        await openSetting()
      }
      //  4.调用收货地址的api
      const address = await chooseAddress();
      //  5.将获取到的收货地址存入缓存
      wx.setStorageSync('address', address)
    } catch (error) {
      console.log(error);
    }

  },
  // 商品选中取消
  handlItemChange(e) {
    // 1.获取被选中商品的goods_id
    let goods_id = e.currentTarget.dataset.id
    // 2.获取购物车数据
    let {
      cart
    } = this.data;
    // 3.找到被修改的商品对象
    let index = cart.findIndex(v => v.goods_id === goods_id);
    // 4.商品状态取反
    cart[index].checked = !cart[index].checked;
    this.setCart(cart)
  },
  // 设置购物车状态同时，重新计算底部工具栏的数据， 全选 总价格和购买的数量
  setCart(cart) {
    // 总价格和总数量
    let totalPrice = 0;
    let totalNum = 0;
    let allchecked = true;
    // 如果商品不等于0 才进行遍历
    if (cart.length != 0) {
      cart.forEach(v => {
        if (v.checked) {
          totalPrice += v.num * v.goods_price,
            totalNum += v.num
        } else {
          allchecked = false;
        }
      })
    }
    // 判断数组是否为空
    allchecked = cart.length != 0 ? allchecked : false;
    this.setData({
      cart,
      allchecked,
      totalPrice,
      totalNum
    })
    wx.setStorageSync('cart', cart)
  },
  // 全选按钮
  handlItemAllchecked() {
    // 1.获取data中的allchecked数据
    let {
      cart,
      allchecked
    } = this.data;
    // 2.直接取反 allchecked =！allchecked
    allchecked = !allchecked;
    // 3 遍历购物车数组 让里面商品 选中状态跟随 allchecked改变而改变
    cart.forEach(v => v.checked = allchecked)
    // 4 把购物车数组 和allchecked 重新设置回data中 把购物车数据重 新存储到缓存中
    this.setCart(cart)
    wx.setStorageSync('cart', cart)
  },
  // 数量加减操作
  async handlCalculate(e) {
    // 获取传递过来的参数
    let {
      openum,
      id
    } = e.currentTarget.dataset;
    // 2.获取data中的购物车数组
    let {
      cart
    } = this.data;
    // 3.获取需要被修改的商品对象
    const index = cart.findIndex(v => v.goods_id === id);
    // 删除
    if (cart[index].num === 1 && openum === -1) {
      const res = await showModal({
        content: '您确定删除吗？'
      });
      if (res.confirm) {
        cart.splice(index, 1)
        this.setCart(cart)
      }
    } else {
      // 4.直接修改商品对象的数量num
      cart[index].num += openum
      // 5.把cart数组 重新设置回data中 把购物车数据重 新存储到缓存中
      this.setCart(cart);
      // wx.getStorageSync('cart')
    }

  },
  // 点击结算
  async handlePay(){
    // 1.判断收获地址
    let {address,totalNum} = this.data;
    // 没有姓名这一项
    if(!address.userName){
      await showToast({title:"请添加收获地址"})
      return
    }
    // 2.判断是否选中
    if(totalNum === 0){
      await showToast({title:"请选择购买商品"})
      return
    }
    // 3.跳转支付页面
    wx.navigateTo({
      url:"/pages/pay/pay"
    })
  }

})